/**
 * 字符串工具函数
 */

/**
 * 首字母大写
 * @param {string} str - 字符串
 * @returns {string} 首字母大写的字符串
 */
export function capitalize(str) {
  if (!str || typeof str !== 'string') {
    return '';
  }
  return str.charAt(0).toUpperCase() + str.slice(1);
}

/**
 * 驼峰命名转换
 * @param {string} str - 字符串
 * @returns {string} 驼峰命名字符串
 */
export function camelCase(str) {
  if (!str || typeof str !== 'string') {
    return '';
  }
  return str
    .replace(/[-_\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))
    .replace(/^[A-Z]/, char => char.toLowerCase());
}

/**
 * 短横线命名转换
 * @param {string} str - 字符串
 * @returns {string} 短横线命名字符串
 */
export function kebabCase(str) {
  if (!str || typeof str !== 'string') {
    return '';
  }
  return str
    .replace(/([a-z])([A-Z])/g, '$1-$2')
    .replace(/[\s_]+/g, '-')
    .toLowerCase();
}

/**
 * 下划线命名转换
 * @param {string} str - 字符串
 * @returns {string} 下划线命名字符串
 */
export function snakeCase(str) {
  if (!str || typeof str !== 'string') {
    return '';
  }
  return str
    .replace(/([a-z])([A-Z])/g, '$1_$2')
    .replace(/[\s-]+/g, '_')
    .toLowerCase();
}

/**
 * 截断字符串
 * @param {string} str - 字符串
 * @param {number} length - 最大长度
 * @param {string} suffix - 后缀，默认为 '...'
 * @returns {string} 截断后的字符串
 */
export function truncate(str, length, suffix = '...') {
  if (!str || typeof str !== 'string') {
    return '';
  }
  if (str.length <= length) {
    return str;
  }
  return str.slice(0, length) + suffix;
}

/**
 * 去除字符串两端空白
 * @param {string} str - 字符串
 * @returns {string} 去除空白后的字符串
 */
export function trim(str) {
  if (!str || typeof str !== 'string') {
    return '';
  }
  return str.trim();
}

/**
 * 生成随机字符串
 * @param {number} length - 长度
 * @param {string} chars - 字符集
 * @returns {string} 随机字符串
 */
export function randomString(
  length = 8,
  chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
) {
  let result = '';
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
}

/**
 * 检查字符串是否为空
 * @param {string} str - 字符串
 * @returns {boolean} 是否为空
 */
export function isEmpty(str) {
  return !str || str.trim().length === 0;
}

/**
 * 检查字符串是否为邮箱格式
 * @param {string} email - 邮箱字符串
 * @returns {boolean} 是否为邮箱格式
 */
export function isEmail(email) {
  if (!email || typeof email !== 'string') {
    return false;
  }
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
}

/**
 * 检查字符串是否为手机号格式
 * @param {string} phone - 手机号字符串
 * @returns {boolean} 是否为手机号格式
 */
export function isPhone(phone) {
  if (!phone || typeof phone !== 'string') {
    return false;
  }
  const phoneRegex = /^1[3-9]\d{9}$/;
  return phoneRegex.test(phone);
}

/**
 * 检查字符串是否为URL格式
 * @param {string} url - URL字符串
 * @returns {boolean} 是否为URL格式
 */
export function isUrl(url) {
  if (!url || typeof url !== 'string') {
    return false;
  }
  try {
    new URL(url);
    return true;
  } catch {
    return false;
  }
}

/**
 * 字符串模板替换
 * @param {string} template - 模板字符串
 * @param {Object} data - 替换数据
 * @returns {string} 替换后的字符串
 */
export function template(template, data) {
  if (!template || typeof template !== 'string') {
    return '';
  }
  if (!data || typeof data !== 'object') {
    return template;
  }

  return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
    return data[key] !== undefined ? data[key] : match;
  });
}
